import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import * as bcrypt from 'bcrypt';
import { InternalServerErrorException } from '@nestjs/common';

@Entity()
export class User {
  // 主键 唯一且自增长
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: 'varchar', length: 50, unique: true })
  account: string;

  @Column({ type: 'varchar', length: 50 })
  username: string;

  @Column()
  passwordHash: string; // 存储密码哈希

  @Column({ default: 4 }) // 默认访客
  roleId: number; // 外键，关联到角色表的id

  @Column({ default: 'viewer' }) // 默认viewer
  roleType: string; // 外键，关联到角色表的type

  @Column({ default: 3 }) // 默认权重 3
  roleWeight: number; // 外键，关联到角色表的weight

  @Column({ default: '访客' }) // 默认访客
  roleName: string; // 外键，关联到角色表的weight

  @Column({ default: 1 })
  createdBy: number; // 创建人id

  @Column()
  createdByAccount: string;

  @CreateDateColumn()
  createdTime: Date;

  @Column({ default: 1 })
  updatedBy: number; // 更新人Id

  @Column()
  updatedByAccount: string;

  @UpdateDateColumn()
  updatedTime: Date;

  @Column({ default: 0 })
  isDeleted: number; // 是否删除，0表示未删除，1表示已删除

  // 可以添加一个方法来设置密码哈希
  async setPasswordHash(password: string): Promise<string> {
    try {
      const salt = await bcrypt.genSalt(10);
      return await bcrypt.hash(password, salt);
    } catch (error) {
      throw new InternalServerErrorException('设置密码失败');
    }
  }

  // 可以添加一个方法来验证密码
  async validatePassword(password: string): Promise<boolean> {
    return bcrypt.compare(password, this.passwordHash);
  }
}
